package org.zhu.service_merge_v2.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by zhu yingzhi on 2017/8/30.
 */
@Aspect
@Component
public class TimeAspect {

    public TimeAspect(){
        logger.info("***********TimeAspect******************");
    }

    //注意第一个参数默认为public
    @Pointcut(value = "execution(public * org.zhu.service_merge_v2.controller.*.*(..))") //定义切入点
    public void cutAspect(){
    }

    private static final Logger logger = LoggerFactory.getLogger(TimeAspect.class);

//    @Before("cutAspect()")
//    public void before(JoinPoint joinPoint){
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        HttpServletRequest request =  attributes.getRequest();
//        //url
//        logger.info("url ={}",request.getRequestURI());
//        //method
//        logger.info("method={}",request.getMethod());
//        //ip
//        logger.info("ip={}",request.getRemoteAddr());
//        //类方法
//        logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+'.'+ joinPoint.getSignature().getName());//获取类名及类方法
//        //参数
//        logger.info("args={}",joinPoint.getArgs());
//    }



    @Around("cutAspect()")
    public Object Interceptor(ProceedingJoinPoint pjp) throws Throwable {

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request =  attributes.getRequest();

        long beginTime = System.currentTimeMillis();


        Object o = pjp.proceed();

        long costMs = System.currentTimeMillis() - beginTime;
        logger.info("url={} method={} 请求结束，耗时：{}ms",  request.getRequestURI(),request.getMethod(),costMs);

        return o;
    }

    }
